/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.gob.pnp.despachadores;

import java.sql.*;
import java.util.*;
import oracle.jdbc.*;
import pe.gob.pnp.actions.*;
import pe.gob.pnp.factories.*;

/**
 *
 * @author Gregorovichz Carlos Rossi
 * @date   01/04/2010
 */
public class DependenciaDespachador {

    public static List<Dependencia> obtenerDependencias() throws SQLException {
        List<Dependencia> lstDependencia = new ArrayList<Dependencia>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_DEPENCIAS(?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.registerOutParameter(1, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(1);
            while (rs.next()) {
                Dependencia dependencia = new Dependencia();
                dependencia.setNdepeIdentificador(rs.getInt("NDEPE_IDENTIFICADOR"));
                dependencia.setBdepeActivo(rs.getBoolean("BDEPE_ACTIVO"));
                dependencia.setCdepeNombre(rs.getString("CDEPE_NOMBRE"));
                dependencia.setCdepeSiglas(rs.getString("CDEPE_SIGLAS"));
                dependencia.setDdepeFechaCreacion(rs.getDate("DDEPE_FECHACREACION"));
                dependencia.setNdepeAreaIdentificador(rs.getInt("NDEPE_AREAIDENTIFICADOR"));
                dependencia.setCdepeDescripcionArea(rs.getString("AREA"));
                lstDependencia.add(dependencia);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return lstDependencia;
    }
    public static List<Dependencia> obtenerDependenciasTipo(int tipo) throws SQLException {
        List<Dependencia> lstDependencia = new ArrayList<Dependencia>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_DEPENCIASTIPO(?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, tipo);
            cs.registerOutParameter(2, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(2);
            while (rs.next()) {
                Dependencia dependencia = new Dependencia();
                dependencia.setNdepeIdentificador(rs.getInt("NDEPE_IDENTIFICADOR"));
                dependencia.setBdepeActivo(rs.getBoolean("BDEPE_ACTIVO"));
                dependencia.setCdepeNombre(rs.getString("CDEPE_NOMBRE"));
                dependencia.setCdepeSiglas(rs.getString("CDEPE_SIGLAS"));
                dependencia.setDdepeFechaCreacion(rs.getDate("DDEPE_FECHACREACION"));
                dependencia.setNdepeAreaIdentificador(rs.getInt("NDEPE_AREAIDENTIFICADOR"));
                dependencia.setCdepeDescripcionArea(rs.getString("AREA"));
                lstDependencia.add(dependencia);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return lstDependencia;
    }
    public static List<Dependencia> obtenerDependenciasDepartamentos(int division) throws SQLException {
        List<Dependencia> lstDependencia = new ArrayList<Dependencia>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_DEPENCIASDPTO(?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, division);
            cs.registerOutParameter(2, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(2);
            while (rs.next()) {
                Dependencia dependencia = new Dependencia();
                dependencia.setNdepeIdentificador(rs.getInt("NDEPE_IDENTIFICADOR"));
                dependencia.setBdepeActivo(rs.getBoolean("BDEPE_ACTIVO"));
                dependencia.setCdepeNombre(rs.getString("CDEPE_NOMBRE"));
                dependencia.setCdepeSiglas(rs.getString("CDEPE_SIGLAS"));
                dependencia.setDdepeFechaCreacion(rs.getDate("DDEPE_FECHACREACION"));
                dependencia.setNdepeAreaIdentificador(rs.getInt("NDEPE_AREAIDENTIFICADOR"));
                dependencia.setCdepeDescripcionArea(rs.getString("AREA"));
                lstDependencia.add(dependencia);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return lstDependencia;
    }
    public static List<Dependencia> obtenerDependenciasOficinas(int dpto,int nivel) throws SQLException {
        List<Dependencia> lstDependencia = new ArrayList<Dependencia>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_OBTENER_DEPENCIASOFIC(?,?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, nivel);
            cs.setInt(2, dpto);
            cs.registerOutParameter(3, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(3);
            while (rs.next()) {
                Dependencia dependencia = new Dependencia();
                dependencia.setNdepeIdentificador(rs.getInt("NDEPE_IDENTIFICADOR"));
                dependencia.setBdepeActivo(rs.getBoolean("BDEPE_ACTIVO"));
                dependencia.setCdepeNombre(rs.getString("CDEPE_NOMBRE"));
                dependencia.setCdepeSiglas(rs.getString("CDEPE_SIGLAS"));
                dependencia.setDdepeFechaCreacion(rs.getDate("DDEPE_FECHACREACION"));
                dependencia.setNdepeAreaIdentificador(rs.getInt("NDEPE_AREAIDENTIFICADOR"));
                dependencia.setCdepeDescripcionArea(rs.getString("AREA"));
                lstDependencia.add(dependencia);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return lstDependencia;
    }
    public static List<DocumentoDependencia> obtenerDocumentoDependencia(int ndepe_codigo) throws SQLException {
        List<DocumentoDependencia> lstDocumentoDependencia = new ArrayList<DocumentoDependencia>();
        Connection conn = null;
        System.out.printf("ndepe: %d%n", ndepe_codigo);
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{ call SP_OBTENER_DOCUMENTOS_DEPE(?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, ndepe_codigo);
            cs.registerOutParameter(2, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(2);
            while (rs.next()) {
                DocumentoDependencia documento = new DocumentoDependencia();
                documento.setCdepe_nombre(rs.getString("CDEPE_NOMBRE"));
                documento.setCtido_descripcion(rs.getString("CTIDO_DESCRIPCION"));
                documento.setDdode_fechacreacion(rs.getString("DDODE_FECHACREACION"));
                documento.setNdode_identificador(rs.getInt("NDODE_IDENTIFICADOR"));
                documento.setNtido_identificador(rs.getInt("NTIDO_IDENTIFICADOR"));
                lstDocumentoDependencia.add(documento);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return lstDocumentoDependencia;
    }

    public static void agregarDependencia(Dependencia dependencia) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_AGREGAR_DEPENDENCIA(?,?,?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setString(1, dependencia.getCdepeNombre());
            cs.setString(2, dependencia.getCdepeSiglas());
            cs.setInt(3, dependencia.isBdepeActivo() ? 1 : 0);

            cs.setInt(4, dependencia.getNdepeAreaIdentificador());
            cs.execute();
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }

    public static void modificarDependencia(Dependencia dependencia) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_MODIFICA_DEPENDENCIA(?,?,?,?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setString(1, dependencia.getCdepeNombre());
            cs.setString(2, dependencia.getCdepeSiglas());
            cs.setInt(3, dependencia.isBdepeActivo() ? 1 : 0);
            cs.setInt(4, dependencia.getNdepeAreaIdentificador());
            cs.setInt(5, dependencia.getNdepeIdentificador());
            cs.execute();
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }

    public static void eliminarDependencia(int ndepeIdentificador) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_ELIMINAR_DEPENDENCIA(?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setInt(1, ndepeIdentificador);
            cs.execute();

        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }

    public static List<Dependencia> obtenerListaDependenciaxTipo(int tipo) throws SQLException {
        List<Dependencia> lstDependencia = new ArrayList<Dependencia>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "SELECT  D.NDEPE_IDENTIFICADOR, D.CDEPE_NOMBRE, ";
            sql += " D.CDEPE_SIGLAS, D.BDEPE_ACTIVO, D.DDEPE_FECHACREACION, ";
            sql += " D.NDEPE_AREAIDENTIFICADOR,A.CDEPE_NOMBRE AS AREA";
            sql += " FROM GENMA_DEPENDENCIA D INNER JOIN GENMA_DEPENDENCIA A";
            sql += " ON D.NDEPE_AREAIDENTIFICADOR = A.NDEPE_IDENTIFICADOR ";
            sql += " WHERE D.BDEPE_ELIMINADO = 0 AND D.NTIDE_CODIGO= ?";
            sql += " ORDER BY A.CDEPE_NOMBRE,D.CDEPE_NOMBRE";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1, tipo);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                Dependencia dependencia = new Dependencia();
                dependencia.setNdepeIdentificador(rs.getInt("NDEPE_IDENTIFICADOR"));
                dependencia.setBdepeActivo(rs.getBoolean("BDEPE_ACTIVO"));
                dependencia.setCdepeNombre(rs.getString("CDEPE_NOMBRE"));
                dependencia.setCdepeSiglas(rs.getString("CDEPE_SIGLAS"));
                dependencia.setDdepeFechaCreacion(rs.getDate("DDEPE_FECHACREACION"));
                dependencia.setNdepeAreaIdentificador(rs.getInt("NDEPE_AREAIDENTIFICADOR"));
                dependencia.setCdepeDescripcionArea(rs.getString("AREA"));
                lstDependencia.add(dependencia);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return lstDependencia;
    }
 }
